home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 April / EnigmA AMIGA RUN 17 (1997)(G.R. Edizioni)(IT)[!][issue 1997-04][EAR-CD].iso / EARCD / comm / tcp / Tallahassee.lha / Tallahassee / pop.e < prev    next >
Text File  |  1996-11-18  |  5KB  |  193 lines

  1. OPT PREPROCESS
  2. MODULE 'exec/nodes','exec/ports',
  3.        'rexxsyslib','rexx/storage'
  4. MODULE 'dos/datetime'
  5. MODULE 'dos/dos'
  6. MODULE 'dos/dostags'
  7. MODULE 'dos/dosextens'
  8. MODULE 'dos/var'
  9.  
  10. DEF my_port:mp
  11. OBJECT myargs
  12. host
  13. port
  14. user
  15. pass
  16. delete
  17. mailbox
  18. ENDOBJECT
  19.  
  20. DEF pop:myargs,tcphandle,incoming[1024]:STRING,outgoing[1024]:STRING
  21. DEF cpp=FALSE
  22. RAISE 999 IF CtrlC()=TRUE
  23. ENUM LOGINFAILURE,CONNECTIONREFUSED
  24.  
  25. PROC main() HANDLE
  26. IF FindPort('TALLAHASSEE') THEN cpp:=TRUE
  27. IF processargs()
  28.   rexxsysbase:=OpenLibrary('rexxsyslib.library',30)
  29.   IF rexxsysbase AND cpp THEN cpp:=TRUE
  30.   my_port:=CreateMsgPort()
  31.   login()
  32.   getmails()
  33. ENDIF
  34. EXCEPT DO
  35. IF tcphandle THEN Close(tcphandle)
  36. IF rexxsysbase THEN CloseLibrary(rexxsysbase)
  37. ENDPROC
  38.  
  39. PROC processargs()
  40. DEF rdargs,success
  41. pop.port:='110'
  42. pop.delete:=FALSE
  43. pop.mailbox:='*'
  44. IF rdargs:=ReadArgs('HOST/A/K,PORT/K,USER/A/K,PASS/A/K,DELETE/S,MAILBOX/K',pop,NIL)
  45.   success:=TRUE
  46.   IF pop.mailbox='*' THEN pop.mailbox:='uumail:postmaster'
  47. ELSE
  48.   success:=FALSE
  49. ENDIF
  50. ENDPROC success
  51.  
  52. PROC login()
  53. DEF tcpfile[256]:STRING
  54. StringF(tcpfile,'tcp:\s/\s',pop.host,pop.port)
  55. tcphandle:=Open(tcpfile,NEWFILE)
  56. IF tcphandle
  57.   IF in()=FALSE THEN RETURN FALSE
  58.   IF out('USER',pop.user) =FALSE THEN RETURN FALSE
  59.   IF in()=FALSE THEN RETURN FALSE
  60.   IF out('PASS',pop.pass) =FALSE THEN RETURN FALSE
  61.   IF in()=FALSE THEN RETURN FALSE
  62. ELSE
  63.   RETURN FALSE
  64. ENDIF
  65. ENDPROC
  66.  
  67. PROC getmails()
  68. DEF mailitems,tempstring[100]:STRING,loop,loopstring[5]:STRING
  69. out('STAT',NIL)
  70. in()
  71. MidStr(tempstring,incoming,InStr(incoming,' ')+1,ALL)
  72. MidStr(tempstring,tempstring,0,InStr(tempstring,' '))
  73. mailitems:=Val(tempstring)
  74. IF cpp THEN sendarexx(mailitems,0)
  75. FOR loop:=1 TO mailitems
  76. StringF(loopstring,'\d',loop)
  77. out('RETR',loopstring)
  78. IF in()=TRUE
  79.   IF cpp THEN sendarexx(mailitems,loop) ELSE WriteF('POP: Getting \d of \d Mails\n',loop,mailitems)
  80.   getitem()
  81. ENDIF
  82. IF pop.delete 
  83.   out('DELE',loopstring)
  84.   in()
  85. ENDIF
  86. ENDFOR
  87. out('QUIT',NIL)
  88. ENDPROC
  89.  
  90. PROC getitem()
  91. DEF huh=FALSE,outfile,com[256]:STRING
  92. IF outfile:=Open('t:pop.tmp',NEWFILE)
  93.   StringF(com,'Received: from \s \s\n',pop.host,datestr())
  94.   Write(outfile,com,EstrLen(com))
  95.   REPEAT 
  96.     huh:=FALSE
  97.     ReadStr(tcphandle,incoming)
  98.     IF StrCmp(incoming,'.',1) AND EstrLen(incoming)=2 THEN huh:=TRUE
  99.     MidStr(incoming,incoming,0,EstrLen(incoming)-1)
  100.     IF huh=FALSE
  101.       Write(outfile,incoming,EstrLen(incoming))
  102.       Write(outfile,'\n',StrLen('\n'))
  103.     ENDIF
  104.   UNTIL huh
  105.   Close(outfile)
  106. ENDIF
  107. StringF(com,'type t:pop.tmp >> \s',pop.mailbox)
  108. Execute(com,NIL,NIL)
  109. ENDPROC
  110.  
  111. PROC in()
  112. DEF success,check[1]:STRING
  113. success:=ReadStr(tcphandle,incoming)
  114. MidStr(check,incoming,0,1)
  115. IF check:='-' THEN success:=FALSE
  116. IF check:='+' THEN success:=TRUE
  117. ->MidStr(incoming,incoming,0,EstrLen(incoming)-1)
  118. ENDPROC (success)
  119.  
  120. PROC out(command,msgdata)
  121. DEF success=TRUE
  122. StringF(outgoing,'\s \s\n',command,msgdata)
  123. success:=Write(tcphandle,outgoing,EstrLen(outgoing))
  124. ENDPROC (success)
  125.  
  126. PROC sendarexx(mailitems,mailno)
  127.     DEF rc=FALSE
  128.     DEF rarg:PTR TO rexxarg
  129.     DEF rxmsg:PTR TO rexxmsg
  130.     DEF retxmsg:PTR TO rexxmsg
  131.     DEF ap:PTR TO mp
  132.     DEF test:PTR TO LONG
  133.     DEF execmsg:PTR TO mn
  134.     DEF node:PTR TO ln
  135.     DEF command[256]:STRING
  136.  
  137.     StringF(command,'pop msgno \d msgs \d',mailno,mailitems)
  138.     IF rxmsg:=CreateRexxMsg(my_port,NIL,NIL)
  139.         execmsg:=rxmsg
  140.         node:=execmsg
  141.         node.name:='popport'
  142.         node.type:=NT_MESSAGE
  143.         node.pri:=0
  144.         execmsg.replyport:=my_port
  145.         IF test:=CreateArgstring(command,EstrLen(command))
  146.             CopyMem({test},rxmsg.args,4)
  147.             rxmsg.action:=RXCOMM+RXFF_RESULT+RXFF_STRING
  148.             rxmsg.passport:=my_port
  149.             rxmsg.stdin:=Input()
  150.             rxmsg.stdout:=Output()
  151.             Forbid()
  152.             ap:=FindPort('TALLAHASSEE')
  153.             IF ap
  154.                 PutMsg(ap,rxmsg)
  155.             ENDIF
  156.             Permit()
  157.             IF ap
  158.               WaitPort(my_port)
  159.               IF retxmsg:=GetMsg(my_port)
  160.                   rc:=rxmsg.result1        /* return code */
  161.                   rarg:=rxmsg.result2
  162.               ENDIF
  163.             ENDIF
  164.             IF test THEN ClearRexxMsg(rxmsg,16)
  165.         ENDIF
  166.         IF rxmsg THEN DeleteRexxMsg(rxmsg)
  167.     ENDIF
  168.     RETURN rc
  169. ENDPROC
  170.  
  171. PROC datestr()
  172.  
  173. ENDPROC 
  174.  
  175. PROC getdate()
  176. DEF dat:datetime,datsta:PTR TO datestamp,tmp[30]:STRING,day[32]:STRING,date[64]:STRING,time[32]:STRING,answer[128]:STRING
  177.  
  178. /* these are filled by DateToStr() */
  179.  
  180.   /* get stamp in part of datetime structure */
  181.   datsta:=DateStamp(dat.stamp)
  182.  
  183.  
  184.   /* fill datetime structure */
  185.   dat.format:=FORMAT_DOS
  186.   dat.flags:=DTB_SUBST
  187.   dat.strday:=day
  188.   dat.strdate:=date
  189.   dat.strtime:=time
  190.   IF DateToStr(dat)
  191.     StringF(answer,'\s, \s \s\n',day,date,time)
  192.   ENDIF
  193. ENDPROC answer